package Bank;

/*
* File:    Banco.java
* Coms:    Servidor que siempre está a la escucha para recibir cliente:
* 		   Para crear nuevas cuentas o para realizar cobros
* 		   Crea hilos independientes para gestionar las consultas
*/

/**
 * @author Daniel Cabrera Ebana - 686013
 * @author Alberto Sanchez Romero - 662385
 * @since 
 */

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Banco {
	/**
	 * @param args
	 * args[0] = Puerto de escucha
	 */
	public static void main(String[] args) {
		
		// comprobar que existen parametros de entrada
		if (args.length !=1) {
			System.out.println("Por favor introduce el número de puerto.");
			System.exit(0);
		}
		
		int SERVER_PORT = Integer.parseInt(args[0]);
		
		System.out.println("Escuchando en el puerto " + SERVER_PORT);
		
		ServerSocket serverSocket = null; //para escuchar
		Socket clientSocket = null;       //uno por cliente
		
		// Inicializar el socket del cliente con el que se va
		// a comunicar el servidor, es decir se acepta la
		// conexión de un cliente al servidor mediante
		// el método accept()
		serverSocket = creaListenSocket(SERVER_PORT);
		
		
		//Crear e iniciar monitor
		GestorCuentas monitor = new GestorCuentas();
		
		while(true){
			
			clientSocket = creaClientSocket(serverSocket);
			Thread hiloBanco = new Thread(new ThreadBanco(clientSocket, monitor));
			hiloBanco.start();
		}
	}
	
	private static ServerSocket creaListenSocket(int serverSockNum){
		ServerSocket server = null;

	try{
		server = new ServerSocket(serverSockNum);
		} catch (IOException e) {
			System.err.println("Problems in port: " + 
					serverSockNum);
			System.exit(-1);
		}
		return server;
	}
	//Establece conexión con server y devuelve socket
	//Aborta programa si no lo logra
	private static Socket creaClientSocket(ServerSocket server){
		Socket res = null;
		try {
			res = server.accept();
		} catch (IOException e) {
			System.err.println("Accept failed.");
			System.exit(1);
		}
		return res;
	}

}
